package com.casic.task;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.casic.dao.MongoDao;
import com.casic.dao.OEEMongoDao;
import com.casic.entity.IotData;
import com.casic.entity.IotOee;
import com.casic.entity.vo.DeviceStateVo;
import com.casic.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author xudezhi
 * @title: OeeTask
 * @projectName iot-platform
 * @description: TODO
 * @date 2021/6/89:14:08
 */
@Slf4j
@Component
public class OeeTask {

    /**
     * 设备分析dao
     */
    @Autowired
    OEEMongoDao oeeMongoDao;

    /**
     * 设备数据
     */
    @Autowired
    MongoDao mongoDao;

    /**
     * 生成设备OEE统计
     */
    @Scheduled(cron = "0 0 1 * * ?") //每天1点统计上一天
    public void sendData(){

        Map<String, Object> map=new HashMap<>();
        try{

            //为了附和原有的接口格式
            Map<String, Object> resultMap = new HashMap<String, Object>();
            List list=new ArrayList();

            /**
             * 昨天0点时间戳
             */
            Calendar startTime = Calendar.getInstance();
            startTime.set(startTime.get(Calendar.YEAR),startTime.get(Calendar.MONTH),startTime.get(Calendar.DAY_OF_MONTH)-1,0,0,0);
            long st = startTime.getTime().getTime();
            /**
             * 昨天23:59:59时间戳
             */
            Calendar endTime = Calendar.getInstance();
            endTime.set(endTime.get(Calendar.YEAR),endTime.get(Calendar.MONTH),endTime.get(Calendar.DAY_OF_MONTH)-1,23,59,59);
            long et = endTime.getTime().getTime();

            Long spacetime = 5* 60 * 1000L; //五分钟
            int i=0;//起始条数
            Long stTemp=st;//起始时间
            Long etTemp=st+spacetime;//起始结束时间

            /**
             * 存储状态信息
             */
            Map<String,HashMap<String,Integer>> stateMap=new HashMap<>();
            /**
             * 获取分别的个数
             */
            while (i < 288 && etTemp < Long.valueOf(et)) {
                stTemp+=spacetime;//起始时间
                etTemp+=spacetime;//起始结束时间

                /**
                 * 查询5分钟内的一条状态采集数据
                 */
                List<DeviceStateVo> data=mongoDao.findStateByTBetween(String.valueOf(stTemp),String.valueOf(etTemp));
                if(data!=null){
                    for (int j = 0; j < data.size(); j++) {
                        /**
                         * 获取设备id
                         */
                        String equipment=data.get(j).getEquipment();
                        //该设备数据已经存在，直接追加
                        if(stateMap.containsKey(equipment)){
                            /**
                             * 设备数据
                             */
                            HashMap<String,Integer> mp=stateMap.get(equipment);
                            /**
                             * 数据处理
                             */
                            Integer gzs=mp.get("3000");
                            gzs+= "3000".equals(data.get(j).getState())?1:0;
                            Integer djs= mp.get("2000");
                            djs+= "2000".equals(data.get(j).getState())?1:0;
                            Integer yxs=mp.get("1000");
                            yxs+= "1000".equals(data.get(j).getState())?1:0;
                            //数值回填
                            mp.put("3000",gzs);
                            mp.put("2000",djs);
                            mp.put("1000",yxs);
                        }else{
                            /**
                             * 数据处理
                             */
                            Integer gzs = "3000".equals(data.get(j).getState())?1:0;
                            Integer djs = "2000".equals(data.get(j).getState())?1:0;
                            Integer yxs = "1000".equals(data.get(j).getState())?1:0;
                            //数值回填
                            HashMap<String,Integer> mp=new HashMap<>();
                            mp.put("3000",gzs);
                            mp.put("2000",djs);
                            mp.put("1000",yxs);
                            /**
                             * 加入总集合
                             */
                            stateMap.put(data.get(j).getEquipment(),mp);
                        }
                    }
                }
                i++;
            }

            Double allTime=86400d;//24小时的秒数
            /**
             * 循环设备处理
             */
            for (String equiment:stateMap.keySet()) {

                /**
                 * 时长计算
                 */
                Double yxsc=stateMap.get(equiment).get("1000")*300d;//运行秒数
                Double gzsc=stateMap.get(equiment).get("2000")*300d;//故障秒数
                Double djsc=stateMap.get(equiment).get("3000")*300d;//待机秒数
                Double kjsc=NumberUtil.add(yxsc,gzsc,djsc).doubleValue();//开机总时长
                Double gjsc=NumberUtil.sub(allTime,kjsc);//关机时长
                /**
                 * 效率计算
                 */
                Double yxl= NumberUtil.div(yxsc,allTime) ;//运行率
                Double gzl=NumberUtil.div(gzsc,allTime);//故障率
                Double djl=NumberUtil.div(djsc,allTime);//待机率
                Double kjl=NumberUtil.div(kjsc,allTime);//开机率
                Double oee=kjsc==0?0d:NumberUtil.div(yxsc,kjsc); //设备oee
                Double oksc=NumberUtil.add(yxsc,djsc);//运行加待机，可用状态
                Double lyl=kjsc==0?0d:NumberUtil.div(oksc,allTime);//利用率

                IotOee iotoee=new IotOee();
                iotoee.setEquipment(equiment);
                iotoee.setDate(DateUtil.format(endTime.getTime(),"yyyy-MM-dd"));
                iotoee.setYxsc(yxsc);
                iotoee.setGzsc(gzsc);
                iotoee.setDjsc(djsc);
                iotoee.setYxl(yxl);
                iotoee.setGzl(gzl);
                iotoee.setDjl(djl);
                iotoee.setKjl(kjl);
                iotoee.setOee(oee);
                iotoee.setLyl(lyl);
                iotoee.setKjsc(kjsc);
                iotoee.setGjsc(gjsc);
                oeeMongoDao.save(iotoee);
            }
        }catch (Exception e){
            DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar=Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY,-24);
            String yesterdayDate=dateFormat.format(calendar.getTime());
            log.info("生成"+yesterdayDate+"OEE数据出现异常"+e.getMessage());
        }

    }
}
